React์ experimental_useOptimistic ํ ์ ํ์ํ์ฌ ์ํ๋ฅผ ๋๊ด์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ณ , ์ด๋ฅผ ํตํด ์ฒด๊ฐ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ด ๊ฐ์ ๋ ๋ฐ์ํ UI๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
React experimental_useOptimistic: ๋๊ด์ UI ์ ๋ฐ์ดํธ๋ฅผ ์ํ ์ข ํฉ ๊ฐ์ด๋
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ธ๊ณ์์ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ด ๋น ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ฌ์ฉ์๋ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์ํธ ์์ฉํ ๋ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ๊ธฐ๋ํ๋ฉฐ, ์ง์ฐ์ ๋ถ๋ง๊ณผ ์ดํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. React์ experimental_useOptimistic ํ
์ ์๋ฒ ์๋ต์ ๋ฐ๊ธฐ ์ ์ UI๋ฅผ ๋๊ด์ ์ผ๋ก ์
๋ฐ์ดํธํ์ฌ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ฐ์ด๋๋ experimental_useOptimistic์ ๋ชฉ์ , ๊ตฌํ, ์ด์ ๋ฐ ์ ์ฌ์ ๋จ์ ์ ๋ํ ํฌ๊ด์ ์ธ ์ดํด๋ฅผ ์ ๊ณตํ๋ฉฐ ๊ทธ ๋ณต์ก์ฑ์ ๊น์ด ํ๊ณ ๋ค ๊ฒ์
๋๋ค.
๋๊ด์ UI๋ ๋ฌด์์ธ๊ฐ?
๋๊ด์ UI๋ ์ฌ์ฉ์ ํ๋์ ๋ํ ์๋ต์ผ๋ก, ํด๋น ํ๋์ด ์ฑ๊ณตํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ฆ์ ์ ๋ฐ์ดํธํ๋ ๋์์ธ ํจํด์ ๋๋ค. ์ด๋ ์ฌ์ฉ์์๊ฒ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ ์ผ๋ก ๋๊ปด์ง๊ฒ ๋ง๋ญ๋๋ค. ๋ด๋ถ์ ์ผ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ฒ์ ์ฒ๋ฆฌ๋ฅผ ์ํด ํด๋น ์ก์ ์ ์ ์กํฉ๋๋ค. ์๋ฒ๊ฐ ์ก์ ์ ์ฑ๊ณต์ ํ์ธํ๋ฉด ๋ ์ด์ ํ ์ผ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฒ๊ฐ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ๋ฉด UI๋ ์๋ ์ํ๋ก ๋กค๋ฐฑ๋๊ณ ์ฌ์ฉ์์๊ฒ ์๋ฆผ์ด ํ์๋ฉ๋๋ค.
๋ค์ ์์๋ฅผ ์๊ฐํด ๋ณด์ธ์:
- ์์ ๋ฏธ๋์ด: ์ฌ์ฉ์๊ฐ ๊ฒ์๋ฌผ์ '์ข์์'๋ฅผ ๋๋ฅด๋ฉด '์ข์์' ์๊ฐ ์ฆ์ ์ฆ๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ์ '์ข์์'๋ฅผ ๋ฑ๋กํ๊ธฐ ์ํ ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ์์ ๊ด๋ฆฌ: ์ฌ์ฉ์๊ฐ ์์ ์ ์๋ฃ๋ก ํ์ํ๋ฉด UI์์ ํด๋น ์์ ์ด ์ฆ์ ์๊ฐ์ ์ผ๋ก ์๋ฃ๋ ๊ฒ์ผ๋ก ํ์๋ฉ๋๋ค.
- ์ ์์๊ฑฐ๋: ์ฌ์ฉ์๊ฐ ์ฅ๋ฐ๊ตฌ๋์ ์ํ์ ์ถ๊ฐํ๋ฉด ์ฅ๋ฐ๊ตฌ๋ ์์ด์ฝ์ด ์๋ฒ ํ์ธ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ ์ํ ์๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
ํต์ฌ ์ด์ ์ ํฅ์๋ ์ฒด๊ฐ ์ฑ๋ฅ์ ๋๋ค. ์ฌ์ฉ์๋ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ๊ฒฝํํ๊ฒ ๋์ด ์๋ฒ ์์ ์ ์๊ฐ์ด ์กฐ๊ธ ๋ ๊ฑธ๋ฆฌ๋๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋น ๋ฆฟ๋น ๋ฆฟํ๊ฒ ๋๊ปด์ง๋๋ค.
experimental_useOptimistic ์๊ฐ
React์ experimental_useOptimistic ํ
์ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ํ์ฌ ์คํ์ ์ธ ๊ธฐ๋ฅ์
๋๋ค. ์ด๋ API๊ฐ ๋ณ๊ฒฝ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด ํ
์ React ์ปดํฌ๋ํธ์์ ๋๊ด์ UI ์
๋ฐ์ดํธ๋ฅผ ๊ตฌํํ๋ ์ ์ธ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ๋๊ด์ ์ผ๋ก ์
๋ฐ์ดํธํ ๋ค์, ์๋ฒ๊ฐ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ๋ฉด ์๋ ์ํ๋ก ๋๋๋ฆด ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ๋๊ด์ ์
๋ฐ์ดํธ ๊ตฌํ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ์ฌ ์ฝ๋๋ฅผ ๋ ๊น๋ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ํ๋ก๋์
ํ๊ฒฝ์์ ์ด ํ
์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ ํฉ์ฑ์ ์ฒ ์ ํ ํ๊ฐํ๊ณ ํฅํ React ๋ฆด๋ฆฌ์ค์์ ๋ฐ์ํ ์ ์๋ API ๋ณ๊ฒฝ์ ๋๋นํด์ผ ํฉ๋๋ค. ์ต์ ์ ๋ณด ๋ฐ ์คํ์ ๊ธฐ๋ฅ๊ณผ ๊ด๋ จ๋ ์ฃผ์ ์ฌํญ์ ๊ณต์ React ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
experimental_useOptimistic์ ์ฃผ์ ์ด์
- ๊ฐ์ํ๋ ๋๊ด์ ์ ๋ฐ์ดํธ: ๋๊ด์ ์ํ ์ ๋ฐ์ดํธ ๊ด๋ฆฌ๋ฅผ ์ํ ๊น๋ํ๊ณ ์ ์ธ์ ์ธ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์๋ ๋กค๋ฐฑ: ์๋ฒ ์์ ์ด ์คํจํ ๊ฒฝ์ฐ ์๋ ์ํ๋ก ๋๋๋ฆฌ๋ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ๋ ๋ฐ์์ด ๋น ๋ฅด๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ญ๋๋ค.
- ์ฝ๋ ๋ณต์ก์ฑ ๊ฐ์: ๋๊ด์ UI ํจํด์ ๊ตฌํ์ ๋จ์ํํ์ฌ ์ฝ๋๋ฅผ ๋ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
experimental_useOptimistic์ ์๋ ๋ฐฉ์
experimental_useOptimistic ํ
์ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค:
- ํ์ฌ ์ํ: ๋๊ด์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ค๋ ์ํ์ ๋๋ค.
- ์ํ๋ฅผ ๋ณํํ๋ ํจ์: ์ด ํจ์๋ ํ์ฌ ์ํ์ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์๋ก์ด ๋๊ด์ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค.
์ด ํ ์ ๋ ๊ฐ์ ์์๋ฅผ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค:
- ๋๊ด์ ์ํ: UI์ ํ์๋๋ ์ํ์ ๋๋ค. ์ฒ์์๋ ํ์ฌ ์ํ์ ๋์ผํฉ๋๋ค. ๋๊ด์ ์ ๋ฐ์ดํธ ํ์๋ ๋ณํ ํจ์์ ์ํด ๋ง๋ค์ด์ง ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํฉ๋๋ค.
- ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์ฉํ๋ ํจ์: ์ด ํจ์๋ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ํ์ฌ ์ํ์ ๋ณํ ํจ์๋ฅผ ์ ์ฉํฉ๋๋ค. ๋ํ ์๋ฒ ์์ ์ด ์๋ฃ๋ ๋(์ฑ๊ณต ๋๋ ์ค๋ฅ) ํด๊ฒฐ๋๋ ํ๋ก๋ฏธ์ค(promise)๋ฅผ ๋ฐํํฉ๋๋ค.
์ค์ฉ์ ์ธ ์์ : ๋๊ด์ '์ข์์' ๋ฒํผ
์์
๋ฏธ๋์ด ๊ฒ์๋ฌผ์ ๋๊ด์ '์ข์์' ๋ฒํผ์ด๋ผ๋ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ํตํด experimental_useOptimistic์ ์ฌ์ฉ๋ฒ์ ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค.
์๋๋ฆฌ์ค: ์ฌ์ฉ์๊ฐ ๊ฒ์๋ฌผ์ '์ข์์' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์๋ฒ๊ฐ '์ข์์'๋ฅผ ํ์ธํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ UI์ '์ข์์' ์๋ฅผ ์ฆ์ ์ฆ๊ฐ์ํค๊ณ ์ถ์ต๋๋ค. ๋ง์ฝ ์๋ฒ ์์ฒญ์ด ์คํจํ๋ฉด(์: ๋คํธ์ํฌ ์ค๋ฅ ๋๋ ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋์ง ์์ ๊ฒฝ์ฐ), '์ข์์' ์๋ฅผ ์๋ ๊ฐ์ผ๋ก ๋๋๋ ค์ผ ํฉ๋๋ค.
```javascript import React, { useState, experimental_useOptimistic as useOptimistic } from 'react'; function Post({ postId, initialLikes }) { const [likes, setLikes] = useState(initialLikes); const [optimisticLikes, addOptimisticLike] = useOptimistic( likes, (currentState, optimisticUpdate) => currentState + optimisticUpdate ); async function handleLike() { const optimisticLikeValue = 1; // ๋๊ด์ ์ ๋ฐ์ดํธ ๊ฐ ์ ์ addOptimisticLike(optimisticLikeValue); try { // ๊ฒ์๋ฌผ '์ข์์' ๋คํธ์ํฌ ์์ฒญ ์๋ฎฌ๋ ์ด์ await fakeLikePost(postId); // ์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ์ค์ likes ์ํ ์ ๋ฐ์ดํธ setLikes(optimisticLikes); } catch (error) { console.error("Failed to like post:", error); // addOptimisticLike๊ฐ ๊ฑฐ๋ถ๋์์ผ๋ฏ๋ก ๋๊ด์ ์ ๋ฐ์ดํธ๋ ์๋์ผ๋ก ๋กค๋ฐฑ๋ฉ๋๋ค setLikes(likes); // ์ด์ ๊ฐ์ผ๋ก ๋กค๋ฐฑ (๊ตฌํ์ ๋ฐ๋ผ ํ์ํ์ง ์์ ์ ์์) } } return (Post ID: {postId}
Likes: {optimisticLikes}
์ค๋ช :
useState:likes์ํ ๋ณ์๋ ์๋ฒ์์ ๊ฐ์ ธ์จ ๊ฒ์๋ฌผ์ ์ค์ '์ข์์' ์๋ฅผ ๋ณด์ ํฉ๋๋ค.useOptimistic: ์ด ํ ์likes์ํ์ ๋ณํ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. ๋ณํ ํจ์๋ ํ์ฌ '์ข์์' ์์ ๋๊ด์ ์ ๋ฐ์ดํธ(์ด ๊ฒฝ์ฐ1)๋ฅผ ๋ํฉ๋๋ค.optimisticLikes: ์ด ํ ์ UI์ ํ์๋๋ '์ข์์' ์๋ฅผ ๋ํ๋ด๋optimisticLikes์ํ ๋ณ์๋ฅผ ๋ฐํํฉ๋๋ค.addOptimisticLike: ์ด ํ ์ ๋ํ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉ๋๋addOptimisticLikeํจ์๋ฅผ ๋ฐํํฉ๋๋ค.handleLike: ์ด ํจ์๋ ์ฌ์ฉ์๊ฐ '์ข์์' ๋ฒํผ์ ํด๋ฆญํ ๋ ํธ์ถ๋ฉ๋๋ค. ๋จผ์ addOptimisticLike(1)์ ํธ์ถํ์ฌ UI์optimisticLikes์๋ฅผ ์ฆ์ ์ฆ๊ฐ์ํต๋๋ค. ๊ทธ๋ฐ ๋ค์,fakeLikePost(์๋ฎฌ๋ ์ด์ ๋ ๋คํธ์ํฌ ์์ฒญ)๋ฅผ ํธ์ถํ์ฌ ์๋ฒ์ '์ข์์' ์ก์ ์ ๋ณด๋ ๋๋ค.- ์ค๋ฅ ์ฒ๋ฆฌ: ๋ง์ฝ
fakeLikePost๊ฐ ๊ฑฐ๋ถ๋๋ฉด(์๋ฒ ์ค๋ฅ ์๋ฎฌ๋ ์ด์ ),catch๋ธ๋ก์ด ์คํ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ,likes์ํ๋ฅผ ์ด์ ๊ฐ์ผ๋ก ๋๋๋ฆฝ๋๋ค(setLikes(likes)ํธ์ถ).useOptimisticํ ์optimisticLikes๋ ์๋์ผ๋ก ์๋ ๊ฐ์ผ๋ก ๋๋๋ฆด ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ํต์ฌ์ `useOptimistic`์ด ์๋ํ ๋๋ก ์์ ํ ์๋ํ๋ ค๋ฉด `addOptimisticLike`๊ฐ ์ค๋ฅ ๋ฐ์ ์ ๊ฑฐ๋ถ๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋จ๊ณ๋ณ ์ค๋ช :
- ์ปดํฌ๋ํธ๋ ์ด๊ธฐ '์ข์์' ์(์: 10)์ ๋์ผํ
likes๋ก ์ด๊ธฐํ๋ฉ๋๋ค. - ์ฌ์ฉ์๊ฐ '์ข์์' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
handleLike๊ฐ ํธ์ถ๋ฉ๋๋ค.addOptimisticLike(1)์ด ํธ์ถ๋์ด UI์optimisticLikes๊ฐ ์ฆ์ 11๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ฌ์ฉ์๋ '์ข์์' ์๊ฐ ์ฆ์ ์ฆ๊ฐํ๋ ๊ฒ์ ๋ด ๋๋ค.fakeLikePost(postId)๋ ์๋ฒ์ ๊ฒ์๋ฌผ์ '์ข์์'ํ๊ธฐ ์ํ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค.- ๋ง์ฝ
fakeLikePost๊ฐ ์ฑ๊ณต์ ์ผ๋ก ํด๊ฒฐ๋๋ฉด(1์ด ํ),setLikes(optimisticLikes)๊ฐ ํธ์ถ๋์ด ์ค์ likes์ํ๋ฅผ 11๋ก ์ ๋ฐ์ดํธํ์ฌ ์๋ฒ์์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค. - ๋ง์ฝ
fakeLikePost๊ฐ ๊ฑฐ๋ถ๋๋ฉด(1์ด ํ),catch๋ธ๋ก์ด ์คํ๋๊ณ ,setLikes(likes)๊ฐ ํธ์ถ๋์ด ์ค์ likes์ํ๋ฅผ 10์ผ๋ก ๋๋๋ฆฝ๋๋ค.useOptimisticํ ์optimisticLikes๊ฐ์ 10์ผ๋ก ๋๋๋ ค ์ผ์น์ํต๋๋ค. UI๋ ์๋ ์ํ(10๊ฐ์ ์ข์์)๋ฅผ ๋ฐ์ํ๊ณ , ์ฌ์ฉ์์๊ฒ๋ ์ค๋ฅ์ ๋ํด ์๋ฆผ์ด ํ์๋ ์ ์์ต๋๋ค(์: ์ค๋ฅ ๋ฉ์์ง).
๊ณ ๊ธ ์ฌ์ฉ๋ฒ ๋ฐ ๊ณ ๋ ค์ฌํญ
๋ณต์กํ ์ํ ์ ๋ฐ์ดํธ
experimental_useOptimistic์ ์ ๋ฌ๋๋ ๋ณํ ํจ์๋ ๋จ์ํ ์ฆ๊ฐ ์ด์์ ๋ณต์กํ ์ํ ์
๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐฐ์ด์ ํญ๋ชฉ์ ์ถ๊ฐํ๊ฑฐ๋, ์ค์ฒฉ๋ ๊ฐ์ฒด๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋, ์ฌ๋ฌ ์ํ ์์ฑ์ ๋์์ ์์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ : ๋๊ธ ๋ชฉ๋ก์ ๋๊ธ ์ถ๊ฐํ๊ธฐ:
```javascript import React, { useState, experimental_useOptimistic as useOptimistic } from 'react'; function CommentList({ initialComments }) { const [comments, setComments] = useState(initialComments); const [optimisticComments, addOptimisticComment] = useOptimistic( comments, (currentComments, newComment) => [...currentComments, newComment] ); async function handleAddComment(text) { const newComment = { id: Date.now(), text, author: "User" }; // ์ ๋๊ธ ๊ฐ์ฒด ์์ฑ addOptimisticComment(newComment); try { // ์๋ฒ์ ๋๊ธ ์ ์ก ์๋ฎฌ๋ ์ด์ await fakeAddComment(newComment); setComments(optimisticComments); } catch (error) { console.error("Failed to add comment:", error); setComments(comments); // ์๋ ์ํ๋ก ๋กค๋ฐฑ } } return (-
{optimisticComments.map(comment => (
- {comment.text} - {comment.author} ))}
์ด ์์ ์์ ๋ณํ ํจ์๋ ํ์ฌ ๋๊ธ ๋ฐฐ์ด๊ณผ ์ ๋๊ธ ๊ฐ์ฒด๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๊ธฐ์กด์ ๋ชจ๋ ๋๊ธ์ ์ ๋๊ธ์ ๋ํ ์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด UI์ ๋ชฉ๋ก์ ๋๊ธ์ ๋๊ด์ ์ผ๋ก ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ฉฑ๋ฑ์ฑ(Idempotency)๊ณผ ๋๊ด์ ์ ๋ฐ์ดํธ
๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌํํ ๋ ์๋ฒ ์์ ์ ๋ฉฑ๋ฑ์ฑ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ฉฑ๋ฑ์ฑ ์๋ ์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ ์ ์ฉํด๋ ์ด๊ธฐ ์ ์ฉ ํ์ ๊ฒฐ๊ณผ๊ฐ ๋ณํ์ง ์๋ ์ฐ์ฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ์ํค๋ ๊ฒ์ ๋ฉฑ๋ฑ์ฑ์ด ์์ต๋๋ค. ์๋ํ๋ฉด ์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ ์ ์ฉํ๋ฉด ์นด์ดํฐ๊ฐ ์ฌ๋ฌ ๋ฒ ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ ๋ฉฑ๋ฑ์ฑ์ด ์์ต๋๋ค. ๋์ผํ ๊ฐ์ ๋ฐ๋ณต์ ์ผ๋ก ์ค์ ํด๋ ์ด๊ธฐ ์ค์ ํ ๊ฒฐ๊ณผ๊ฐ ๋ณ๊ฒฝ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ฒ ์์ ์ด ๋ฉฑ๋ฑ์ฑ์ด ์๋ ๊ฒฝ์ฐ, ์ฌ์๋๋ ๋คํธ์ํฌ ๋ฌธ์ ๋ฐ์ ์ ๋๊ด์ ์ ๋ฐ์ดํธ๊ฐ ์ฌ๋ฌ ๋ฒ ์ ์ฉ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์ ์ค ํ๋๋ ๊ฐ ๋๊ด์ ์ ๋ฐ์ดํธ์ ๋ํด ๊ณ ์ ID๋ฅผ ์์ฑํ๊ณ ํด๋น ID๋ฅผ ์๋ฒ ์์ฒญ์ ํฌํจํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์๋ฒ๋ ์ด ID๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต ์์ฒญ์ ๊ฐ์งํ๊ณ ์ฐ์ฐ์ด ๋ ๋ฒ ์ด์ ์ ์ฉ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ณ ์๊ธฐ์น ์์ ๋์์ ๋ฐฉ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๋ณต์กํ ์ค๋ฅ ์๋๋ฆฌ์ค ์ฒ๋ฆฌ
๊ธฐ๋ณธ ์์ ์์๋ ์๋ฒ ์์ ์ด ์คํจํ ๊ฒฝ์ฐ ๋จ์ํ ์๋ ์ํ๋ก ๋๋๋ฆฝ๋๋ค. ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ ๋ณต์กํ ์ค๋ฅ ์๋๋ฆฌ์ค๋ฅผ ์ฒ๋ฆฌํด์ผ ํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์์๊ฒ ํน์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํ๊ฑฐ๋, ์์ ์ ์ฌ์๋ํ๊ฑฐ๋, ์ฌ์ง์ด ๋ค๋ฅธ ์์ ์ ์๋ํ ์๋ ์์ต๋๋ค.
handleLike ํจ์์ catch ๋ธ๋ก์ ์ด๋ฌํ ๋ก์ง์ ๊ตฌํํ๋ ๊ณณ์
๋๋ค. fakeLikePost ํจ์๊ฐ ๋ฐํํ ์ค๋ฅ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ ์ ํ์ ํ์ธํ๊ณ ์ ์ ํ ์กฐ์น๋ฅผ ์ทจํ ์ ์์ต๋๋ค.
์ ์ฌ์ ์ธ ๋จ์ ๋ฐ ๊ณ ๋ ค์ฌํญ
- ๋ณต์ก์ฑ: ๋๊ด์ UI ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌํํ๋ฉด ์ฝ๋์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ ์ ์์ผ๋ฉฐ, ํนํ ๋ณต์กํ ์ํ ์ ๋ฐ์ดํธ๋ ์ค๋ฅ ์๋๋ฆฌ์ค๋ฅผ ์ฒ๋ฆฌํ ๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ถ์ผ์น: ์๋ฒ ์์ ์ด ์คํจํ๋ฉด ์ํ๊ฐ ๋๋๋ ค์ง ๋๊น์ง UI๊ฐ ์ผ์์ ์ผ๋ก ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํฉ๋๋ค. ์คํจ๊ฐ ์ ์ ํ๊ฒ ์ฒ๋ฆฌ๋์ง ์์ผ๋ฉด ์ฌ์ฉ์์๊ฒ ํผ๋์ ์ค ์ ์์ต๋๋ค.
- ๋ฉฑ๋ฑ์ฑ: ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ค๋ฉด ์๋ฒ ์์ ์ด ๋ฉฑ๋ฑ์ฑ์ด ์๊ฑฐ๋ ์ค๋ณต ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํ๋ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋คํธ์ํฌ ์ ๋ขฐ์ฑ: ๋๊ด์ UI ์ ๋ฐ์ดํธ๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ์ผ๋ฐ์ ์ผ๋ก ์ ๋ขฐํ ์ ์์ ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ ๋๋ค. ๋คํธ์ํฌ ์ค๋จ์ด ์ฆ์ ํ๊ฒฝ์์๋ ๋ฐ์ดํฐ ๋ถ์ผ์น ๊ฐ๋ฅ์ฑ ๋๋ฌธ์ ์ด์ ์ด ์์๋ ์ ์์ต๋๋ค.
- ์คํ์ ํน์ฑ:
experimental_useOptimistic์ ์คํ์ ์ธ API์ด๋ฏ๋ก ํฅํ React ๋ฒ์ ์์ ์ธํฐํ์ด์ค๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
experimental_useOptimistic์ ๋์
experimental_useOptimistic์ ๋๊ด์ UI ์
๋ฐ์ดํธ๋ฅผ ๊ตฌํํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ๊ณ ๋ คํด ๋ณผ ๋งํ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ ์์ต๋๋ค:
- ์๋ ์ํ ๊ด๋ฆฌ:
useState๋ฐ ๊ธฐํ React ํ ์ ์ฌ์ฉํ์ฌ ๋๊ด์ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ ๋ฐ์ดํธ ํ๋ก์ธ์ค์ ๋ํ ๋ ๋ง์ ์ ์ด๊ถ์ ์ ๊ณตํ์ง๋ง ๋ ๋ง์ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. - ๋ผ์ด๋ธ๋ฌ๋ฆฌ: Redux Toolkit์
createAsyncThunk๋ Zustand์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋น๋๊ธฐ ์ํ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ๋๊ด์ ์ ๋ฐ์ดํธ์ ๋ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํ ์ ์์ต๋๋ค. - GraphQL ํด๋ผ์ด์ธํธ ์บ์ฑ: GraphQL์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: Apollo Client ๋๋ Relay)๊ฐ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ํตํด ๋๊ด์ ์ ๋ฐ์ดํธ์ ๋ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํ ์ ์์ต๋๋ค.
experimental_useOptimistic์ ์ธ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
experimental_useOptimistic์ ํน์ ์๋๋ฆฌ์ค์์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๊ท์คํ ๋๊ตฌ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ์ ๊ณ ๋ คํด ๋ณด์ธ์:
- ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ด ์ค์ํ ๊ฒฝ์ฐ: ์ฌ์ฉ์ ์ฐธ์ฌ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ด ํ์ํ ์ํธ ์์ฉ(์: ์ข์์, ๋๊ธ ๋ฌ๊ธฐ, ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ).
- ์๋ฒ ์์ ์ด ๋น๊ต์ ๋น ๋ฅธ ๊ฒฝ์ฐ: ์๋ฒ ์์ ์ด ์คํจํ ๊ฒฝ์ฐ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์ํ๊ฒ ๋๋๋ฆด ์ ์์ต๋๋ค.
- ๋จ๊ธฐ์ ์ธ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ์ค์ํ์ง ์์ ๊ฒฝ์ฐ: ์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์งง์ ๊ธฐ๊ฐ์ ๋ฐ์ดํฐ ๋ถ์ผ์น๊ฐ ํ์ฉ๋ฉ๋๋ค.
- ์คํ์ ์ธ API ์ฌ์ฉ์ ์ต์ํ ๊ฒฝ์ฐ: API ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ธ์งํ๊ณ ์์ผ๋ฉฐ ๊ทธ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์กฐ์ ํ ์ํฅ์ด ์์ต๋๋ค.
experimental_useOptimistic ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๋ช ํํ ์๊ฐ์ ํผ๋๋ฐฑ ์ ๊ณต: UI๊ฐ ๋๊ด์ ์ผ๋ก ์ ๋ฐ์ดํธ๋์์์ ์ฌ์ฉ์์๊ฒ ๋ช ํํ๊ฒ ํ์ํฉ๋๋ค(์: ๋ก๋ฉ ํ์๊ธฐ ๋๋ ๋ฏธ๋ฌํ ์ ๋๋ฉ์ด์ ํ์).
- ์ค๋ฅ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌ: ์๋ฒ ์์ ์ด ์คํจํ๊ณ ์ํ๊ฐ ๋๋๋ ค์ง๋ฉด ์ฌ์ฉ์์๊ฒ ์ ์ตํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
- ๋ฉฑ๋ฑ์ฑ ๊ตฌํ: ์๋ฒ ์์ ์ด ๋ฉฑ๋ฑ์ฑ์ด ์๊ฑฐ๋ ์ค๋ณต ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํ๋ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํฉ๋๋ค.
- ์ฒ ์ ํ ํ ์คํธ: ๋คํธ์ํฌ ์ค๋จ ๋ฐ ์๋ฒ ์ค๋ฅ๋ฅผ ํฌํจํ ๋ค์ํ ์๋๋ฆฌ์ค์์ ๋๊ด์ UI ์ ๋ฐ์ดํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ์ฒ ์ ํ ํ ์คํธํฉ๋๋ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ๋๊ด์ UI ์ ๋ฐ์ดํธ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ์ฌ ์ค์ ๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ณ ์๋์ง ํ์ธํฉ๋๋ค.
- ๋ชจ๋ ๊ฒ ๋ฌธ์ํ: ์ด๊ฒ์ ์คํ์ ์ธ ๊ธฐ๋ฅ์ด๋ฏ๋ก, `useOptimistic`์ด ์ด๋ป๊ฒ ๊ตฌํ๋์๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฐ์ ์ด๋ ์ ์ฝ ์ฌํญ์ ๋ช ํํ๊ฒ ๋ฌธ์ํํฉ๋๋ค.
๊ฒฐ๋ก
React์ experimental_useOptimistic ํ
์ ๋ ๋ฐ์์ด ๋น ๋ฅด๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. ์๋ฒ ์๋ต์ ๋ฐ๊ธฐ ์ ์ UI๋ฅผ ๋๊ด์ ์ผ๋ก ์
๋ฐ์ดํธํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ๋ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก๋์
ํ๊ฒฝ์์ ์ด ํ
์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ ์ฌ์ ์ธ ๋จ์ ๊ณผ ๊ณ ๋ ค์ฌํญ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ๊ฐ์ด๋์ ์ค๋ช
๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฑ์ ์ ์งํ๋ฉด์ experimental_useOptimistic์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. React๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ด ์คํ์ ๊ธฐ๋ฅ์ ์ต์ ์
๋ฐ์ดํธ ๋ฐ ์ ์ฌ์ ์ธ API ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์ ๋ณด๋ฅผ ๊ณ์ ํ์ธํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.